home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1995-11-25 | 6.7 KB | 195 lines |
- IMPLEMENTATION MODULE PopUpMenue;
-
- FROM SYSTEM IMPORT TSIZE,ADDRESS,VAL,ADR;
-
- FROM EasyDialog IMPORT GetObjectXYWH,SetObjectXYWH,and,WorkTree,TreePROC;
-
- FROM Strings IMPORT RightStr,EqualStr,Concat,Length;
-
- FROM KbdEvnt IMPORT ConcatScanString;
-
- FROM BitBlt IMPORT CopyScreenToMem,CopyMemToScreen;
-
- FROM AES IMPORT ObjectFind,ObjectDraw,ObjectChange,EventMultiple,
- WindowGet,GrafMouse;
-
- FROM GEMAESBase IMPORT Object,Disabled,Selected,Checked,GraphicString,
- WorkXYWH,MouseOff,MouseOn,ButtonEvent,KeyboardEvent,
- TimerEvent;
-
- VAR MenuString,ScanString : ARRAY [0..7] OF CHAR;
- Item,Laenge : INTEGER;
-
- PROCEDURE GetObjectState(Index:INTEGER; TreePtr:ADDRESS):INTEGER;
- VAR Probe :POINTER TO Object;
- BEGIN
- Probe:=TreePtr+VAL(ADDRESS, (Index*TSIZE(Object)));
- RETURN Probe^.state;
- END GetObjectState;
-
- PROCEDURE PopUpMenuItemCheck(Tree : ADDRESS; Item :INTEGER; Check :BOOLEAN);
- (* Display or erase a check mark next to a menu item *)
- VAR x,y,w,h :CARDINAL;
- BEGIN
- GetObjectXYWH(0,Tree,x,y,w,h);
- IF Check THEN
- IF ~and(GetObjectState(Item,Tree),Checked) THEN
- ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)+Checked,0);
- END(*IF*);
- ELSE
- IF and(GetObjectState(Item,Tree),Checked) THEN
- ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)-Checked,0);
- END(*IF*);
- END(*IF*);
- END PopUpMenuItemCheck;
-
- PROCEDURE PopUpMenuItemEnable (Tree: ADDRESS; Item:INTEGER; Enable: BOOLEAN);
- (* Enables or disables a menu item *)
- VAR x,y,w,h :CARDINAL;
- BEGIN
- GetObjectXYWH(0,Tree,x,y,w,h);
- IF ~Enable THEN
- IF ~and(GetObjectState(Item,Tree),Disabled) THEN
- ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)+Disabled,0);
- END(*IF*);
- ELSE
- IF and(GetObjectState(Item,Tree),Disabled) THEN
- ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)-Disabled,0);
- END(*IF*);
- END(*IF*);
- END PopUpMenuItemEnable;
-
- PROCEDURE PopUpMenuText (Tree: ADDRESS; Item: INTEGER; Text: ARRAY OF CHAR);
- (* Changes the text of a menu item *)
- (* funktioniert nur nicht so wie ich mir das vorstellte ! *)
- VAR i : INTEGER;
- Probe : POINTER TO Object;
- s : POINTER TO ARRAY [0..40] OF CHAR;
- BEGIN
- Probe:=Tree+VAL(ADDRESS, (Item*TSIZE(Object)));
- IF Probe^.type=GraphicString THEN
- s:= Probe^.spec;
- IF HIGH(Text)>39 THEN
- FOR i:=0 TO 39 DO
- s^[i]:=Text[i];
- END(*FOR*);
- s^[40]:=0C;
- ELSE
- FOR i:=0 TO HIGH(Text) DO
- s^[i]:=Text[i];
- END(*FOR*);
- s^[HIGH(Text)]:=0C;
- END(*IF*);
- END(*IF*);
- END PopUpMenuText;
-
- PROCEDURE SearchPopMenuTree(MenuTree:ADDRESS; Index :INTEGER);
- VAR
- MenuObject : POINTER TO Object;
- s : POINTER TO ARRAY [0..40] OF CHAR;
- OK : BOOLEAN;
- BEGIN
- s:=ADR(MenuString);
- MenuObject:=MenuTree+ VAL(ADDRESS,(Index*TSIZE(Object)));
- IF (MenuObject^.type=GraphicString) AND ~and(MenuObject^.state,Disabled) THEN
- s:=MenuObject^.spec;
- RightStr(s^,Laenge,MenuString,OK);
- IF OK AND EqualStr(ScanString,MenuString)THEN
- Item:=Index;
- END(*IF*);
- END(*IF*);
- END SearchPopMenuTree;
-
-
- PROCEDURE UpDate(Tree :ADDRESS;Last,new :INTEGER);
- VAR x,y,w,h :CARDINAL;
- BEGIN
- GetObjectXYWH(0,Tree,x,y,w,h);
- IF Last>0 THEN
- IF ~and(GetObjectState(Last,Tree),Disabled)
- AND and(GetObjectState(Last,Tree),Selected) THEN
- ObjectChange(Tree,Last,0,x-1,y-1,w+4,h+4,GetObjectState(Last,Tree)-Selected,1);
- END(*IF*);
- END(*IF*);
- IF new>0 THEN
- IF ~and(GetObjectState(new,Tree),Disabled)
- AND ~and(GetObjectState(new,Tree),Selected) THEN
- ObjectChange(Tree,new,0,x-1,y-1,w+4,h+4,GetObjectState(new,Tree)+Selected,1);
- END(*IF*);
- END(*IF*);
- END UpDate;
-
- PROCEDURE PopUp(x,y:INTEGER; PopTree :ADDRESS ) : INTEGER;
- VAR dx,dy,dw,dh : CARDINAL;
- wx,wy,ww,wh : INTEGER;
- Akt,Last,MouseX,MouseY,Keystate,
- Scancode,Mouseclicks :INTEGER;
- Buffer : ADDRESS;
- MsgBuf : ARRAY [0..7] OF INTEGER;
- Clicks,event,Mousebutton : INTEGER;
- search :TreePROC;
-
- BEGIN
- search:=SearchPopMenuTree;
- GetObjectXYWH(0,PopTree,dx,dy,dw,dh);
- WindowGet(0,WorkXYWH,wx,wy,ww,wh);
- (* Wenn das Objekt nicht komplett auf den Bildschirm passt *)
- (* werden die Koordinaten x,y so verschoben das es vollständig *)
- (* darstellbar ist *)
- IF (wx+ww)<(x+VAL(INTEGER,dw)) THEN
- x:=(wx+ww)-VAL(INTEGER,dw);
- END(*IF*);
- IF (wy+wh)<(y+VAL(INTEGER,dh)) THEN
- y:=(wy+wh)-VAL(INTEGER,dh);
- END(*IF*);
- SetObjectXYWH(0,PopTree,x,y,dw,dh);
- (* Bildschirmhintergrund retten für Redraw *)
- GrafMouse(MouseOff,NIL);
- CopyScreenToMem(x-2,y-2,dw+6,dh+6,Buffer);
- ObjectDraw(PopTree,0,8,x-1,y-1,dw+4,dh+4);
- GrafMouse(MouseOn,NIL);
- Last:=0;Akt:=0;
- REPEAT
- event:= EventMultiple(ButtonEvent+KeyboardEvent+TimerEvent,
- 01,03,01, (* wartet auf Mausclicks *)
- 0,0,0,0,0,0,0,0,0,0,
- ADR(MsgBuf),(* hier bedeutungslos *)
- 50,0, (* alle 50 ms wird die neue Position der Maus abgefragt *)
- MouseX,MouseY,
- Mousebutton,Keystate,Scancode,Mouseclicks);
-
- Last:= Akt;
- (* Wo ist die Maus ?*)
- Akt:=ObjectFind(PopTree,0,8,MouseX,MouseY);
- IF event = KeyboardEvent THEN (* Tastaturunterstützung in PopupMenüs sieht genauso aus wie in normalen Menüs *)
- MenuString:=' ';ScanString:=' ';
- ConcatScanString(ScanString,Keystate,Scancode);
- Item:= -1;
- Laenge:=Length(ScanString);
- WorkTree(PopTree,0,0,search);
- (* Wenn Shortcut gefunden dann anclicken des Menüeintrages simulieren*)
- IF Item >0 THEN
- event:=ButtonEvent;
- Mouseclicks:=1;
- Mousebutton:=1;
- Akt:= Item;
- END(*IF*);
- END(*IF*);
- IF Last # Akt THEN
- UpDate(PopTree,Last,Akt);
- END(*IF*);
- UNTIL (event=ButtonEvent) AND (Mouseclicks>0) AND (Mousebutton>0);
- UpDate(PopTree,Akt,0);
- GrafMouse(MouseOff,NIL);
- (* Bildschirmhintergrund wieder herstellen *)
- CopyMemToScreen(x-2,y-2,dw+6,dh+6,Buffer,TRUE);
- GrafMouse(MouseOn,NIL);
- IF ~and(GetObjectState(Akt,PopTree),Disabled) THEN
- RETURN Akt;
- ELSE
- RETURN -1
- END(*IF*);
- END PopUp;
-
- END PopUpMenue.
-